/*
 * Created by VS2005Express
 * user: Ramayac
 */
using System;
using System.Data;
using System.Collections.Generic;
using DataLayer;
using MySql.Data.MySqlClient;

namespace Inventador
{
	public class Movimiento
	{
		#region Campos

        //id, producto, cantidad, fecha
		private int _id;
        private string _tipomovimiento; //Entrada o salidas
        private Producto _fkProducto;
        private int _cantidad;
        private DateTime _fecha; 
		
		#endregion
		
		#region Propiedades
		
		public int Id
		{
			get { return this._id; }
			set { this._id = value; }
		}

        public string TipoMovimiento
        {
            get { return this._tipomovimiento; }
            set { this._tipomovimiento = value; }
        }

        public Producto fkProducto
        {
            get { return this._fkProducto; }
            set { this._fkProducto = value; }
        }

        public int Cantidad
        {
            get { return this._cantidad; }
            set { this._cantidad = value; }
        }
        
        public DateTime Fecha
        {
        	get { return this._fecha; }
        	set { this._fecha = value; }
        }

		#endregion
		
		#region Metodos

		public Movimiento(int pId, string pTipoMovimiento, Producto pProducto, int pCantidad, DateTime pFecha)
		{
			this.Id = pId;
            this.TipoMovimiento = pTipoMovimiento;
            this.fkProducto = pProducto;
            this.Cantidad = pCantidad;
            this.Fecha = pFecha;
		}
		
		public bool GetFromDb(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
			MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Movimiento AS mv WHERE id=" + this.Id.ToString());
			if(lector.HasRows)
			{
				lector.Read();
                //this.fkTipoProducto.Id = int.Parse...
                this.fkProducto.Id = int.Parse(lector["producto"].ToString());
                this.fkProducto.GetFromDb(bdatos);
                this.TipoMovimiento = lector["tipo"].ToString();
                this.Cantidad = int.Parse(lector["cantidad"].ToString());                
                this.Fecha = Movimiento.FormatFecha(lector["fecha"].ToString());
                bdatos.Desconectar();
				return true;
			}
			bdatos.Desconectar();
			return false;
		}

		public static List<Movimiento> GetListByProducto(BaseDatos bdatos, int ProdId, string orderBy)
		{
			bdatos = new BaseDatos();
			return Movimiento.GetList(bdatos, "id != 0 AND producto = " + ProdId.ToString(), orderBy);
//			bdatos.Conectar();
//            		MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Movimiento AS mv WHERE producto=" + this.fkProducto.Id.ToString());
//			if(lector.HasRows)
//			{
//		                lector.Read();
//		                this.Id = int.Parse(lector["id"].ToString());
//		                this.TipoMovimiento = lector["tipo"].ToString();
//		                this.Cantidad = int.Parse(lector["cantidad"].ToString());
//		                this.Fecha = Movimiento.FormatFecha(lector["fecha"].ToString());
//		                //supongo que como ya tengo el producto, no tengo que pedirlo?
//		                bdatos.Desconectar();
//		                return true;
//			}
//			bdatos.Desconectar();
//			return false;
		}

        public bool GetFromDbByTipoMovimiento(BaseDatos bdatos)
        {
        	bdatos = new BaseDatos();
            bdatos.Conectar();
            MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Movimiento AS mv WHERE tipo='" + this.TipoMovimiento + "'");
            if (lector.HasRows)
            {
                lector.Read();
                this.Id = int.Parse(lector["id"].ToString());
                this.Cantidad = int.Parse(lector["cantidad"].ToString());
                this.Fecha = DateTime.Parse(lector["fecha"].ToString());
                this.fkProducto.Id = int.Parse(lector["producto"].ToString());
                this.Fecha = Movimiento.FormatFecha(lector["fecha"].ToString());
                this.fkProducto.Id = int.Parse(lector["producto"].ToString());
                this.fkProducto.GetFromDb(bdatos); //ACTUALIZAR por el cambio de producto. ok.
                bdatos.Desconectar();
                return true;
            }
            bdatos.Desconectar();
            return false;
        }

		public static List<Movimiento> GetList(BaseDatos bdatos, string condicion, string orderBy)
		{
			bdatos = new BaseDatos();
			List<Movimiento> lst = new List<Movimiento>();
			string consulta = "SELECT * FROM Movimiento AS mv";
			if(condicion != "") 
				consulta += " WHERE " + condicion;
			if(orderBy != "")
				consulta += " ORDER BY " + orderBy;
			bdatos.Conectar();
			MySqlDataReader lector = bdatos.EjecutarConsulta(consulta);
            //TODO: ROBERTO: Please CHECK this part!!!
			if(lector.HasRows)
			{
                		while (lector.Read())
                		{
                    		Producto foo = new Producto(int.Parse(lector["producto"].ToString()), null, null, 0, 0, "", 0, null);
                    		foo.GetFromDb(bdatos);
                    		lst.Add(new Movimiento(int.Parse(lector["id"].ToString()), lector["tipo"].ToString(), foo, int.Parse(lector["cantidad"].ToString()), Movimiento.FormatFecha(lector["fecha"].ToString())));
                		} 
			}
			bdatos.Desconectar();
            return lst;
		}

		public void Insert(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            //id, tipo, producto, cantidad, fecha
            bdatos.EjecutarOperacion("INSERT INTO Movimiento VALUES(" + this.Id.ToString() +
                ", '" + this.TipoMovimiento +
                "', " + this.fkProducto.Id.ToString() +
                ", " + this.Cantidad.ToString() + 
                ", '" + Movimiento.FormatFecha(this.Fecha) + "' )");
			bdatos.Desconectar();
		}
		
		public void Update(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            bdatos.EjecutarOperacion("UPDATE Movimiento SET tipo='" + this.TipoMovimiento +
                "', producto=" + this.fkProducto.Id.ToString() + 
                ", cantidad=" + this.Cantidad.ToString() +
                ", fecha='" + Movimiento.FormatFecha(this.Fecha) +
                "' WHERE id=" + this.Id.ToString());
			bdatos.Desconectar();
		}
		
		public void Delete(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            bdatos.EjecutarOperacion("DELETE FROM Movimiento WHERE id=" + this.Id.ToString());
			bdatos.Desconectar();
		}
		
		public static int GetMaxId(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
			int maxId = bdatos.EjecutarEscalar("SELECT MAX(id) FROM Movimiento");
			bdatos.Desconectar();
			return maxId;
		}
		
		public static DateTime FormatFecha(string fecha)
		{
			string[] foobar = fecha.Split("/".ToCharArray());
			return new DateTime(int.Parse(foobar[0]), int.Parse(foobar[1]), int.Parse(foobar[2]));
		}
		
		public static string FormatFecha(DateTime fecha)
		{
			return fecha.Year.ToString() + "/" + fecha.Month.ToString() + "/" + fecha.Day.ToString();
		}
		
		#endregion
	}
}
